<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Item_model extends CI_Model {
    public $card;
    public $whereIt;
    public $traffic;
    public $allowedSklads;
    public $fromSklad;
    public $error = NULL;
    
    function __construct()
    {
        parent::__construct();
    }
    /**
     * Метод получения информации о предмете
     * @param int $id код предмета
     */
    function GetCard($id)
    {
        $this->db
                ->select('  items.id,
                            items.name,
                            item_group.name as gname,
                            items.comments,
                            items.buy_price,
                            items.buy_count,
                            items.measure,
                            items.buy_date,
                            contragents.name as cagent,
                            contragents.phone')
                ->from('item_group')
                ->where('items.id', $id)
                ->join('items', 'item_group.id = items.group_id', 'Inner')
                ->join('contragents', 'contragents.id = items.contragent_id', 'left');
        $q = $this->db->get();
        if( $q->num_rows() > 0 )
            return $q->row();
        else
            return FALSE;
    } 
    /**
     * Передвижение предмета
     * @param int $itemID код предмета
     */
    function GetTraffic($itemID)
    {
        //DATE_FORMAT ( wh_traffic.date, "%d.%m.%y" ) as date,
        $this->db
                ->select('  wh_traffic.item_id,
                            wh_traffic.traffic,
                            wh_traffic.count,
                            wh_traffic.date as d,
                            wh_traffic.date as date,
                            objects.object_name,
                            objFrom.object_name as objFromName,
                            wh_traffic.comments', 
                        FALSE) //не экранируем поля
                ->from('wh_traffic')
                ->where('wh_traffic.item_id', $itemID)
                ->join('objects', 'objects.id = wh_traffic.object_id','inner')
                ->join('objects as objFrom', 'objFrom.id = wh_traffic.fromObject_id','inner')
                ->order_by('d', 'DESC');
        $q = $this->db->get();
        if( $q->num_rows() > 0 )
            return $q->result();
        else
            return FALSE;  
    }
    /**
     * Поиск  где находится предмет и в каком количестве
     * @param type $id код предмета
     */
    function WhereItem($id) {
        $this->db
                ->select('  
                        wh_items.onSklad,
                        objects.object_name,
                        objects.alt_name,
                        objects.id as objID,
                        items.measure')
                ->from('wh_items')
                ->where('wh_items.item_id', $id)
                ->where('wh_items.onSklad >', 0)
                ->join('objects', 'objects.alt_name = wh_items.sklad_alt', 'Inner')
                ->join('items', 'items.id = wh_items.item_id', 'inner');
        $q = $this->db->get();
        
        //echo $this->db->last_query();
        if ($q->num_rows() > 0)
            return $q->result();
        else
            return FALSE;
    }
    /**
     * Инициализация карты предмета
     * @param type $id код предмета
     */
    function InitCard ($id)
    {
        $this->card = $this->GetCard($id);   
        if ($this->card == FALSE)
            $this->error = 'Не существующая запись';
        else
        {
            $this->whereIt = $this->WhereItem($id);       
            if ($this->whereIt == FALSE)
                $this->error = 'Не найден на складах';
            else
                $this->traffic = $this->GetTraffic($id);
        }
        
    }
    
    /**
     * Инициализация страницы перемещения
     * @param type $id код предмета
     * @param type $fromSklad откуда
     * @param type $toSklad куда
     */
    function InitMove($id, $fromSklad)
    {
        $this->load->model('Objects_model');
        $this->InitCard($id);
        if ($this->error == NULL)
        {
            $this->allowedSklads = $this->Objects_model->GetObjectsArray($fromSklad);
            //print_r($this->allowedSklads);
            $this->fromSklad     = $this->Objects_model->GetObject(array('alt_name' => $fromSklad));
            //print_r($this->fromSklad);
        }
    }
    
    
    /**
     * Сохранение перемещения предмета
     * @param array(itemId, traffic, count, comment, sklad(fromObj, toOjb, skladAlt)) $data Массив со значениями
     */
    function SaveMove($data)
    {
        $_wh_input = array(
            'id'            => 0,
            'item_id'       => $data['itemId'],
            'traffic'       => $data['traffic'],
            'count'         => $data['count'],
            'date'          => date("Y:m:d G:i"),
            'object_id'     => $data['sklad']['toObj'],
            'comments'      => $data['comments'],
            'fromObject_id' => $data['sklad']['fromObj']
        );
        
        //@todo сделать одним запросом вставку или обновление
        $this->db->trans_start();
        //ищем предмет на складах
        $this->db->where('wh_items.item_id', $data['itemId'])
                 ->where('wh_items.sklad_alt', $data['sklad']['ToSkladAlt']);
        $row = $this->db->get('wh_items');
        //нашли?
        if ($row->num_rows() > 0)
        {
            //Обновляем запись
            $this->db->where('wh_items.item_id', $data['itemId'])
                     ->where('wh_items.sklad_alt', $data['sklad']['ToSkladAlt'])
                     ->set('onSklad', 'wh_items.onSklad +'.$data['count'], FALSE);
            $this->db->update('wh_items');
        } else 
        {
            //не нашли? добавим новую!
            $_wh_items = array(
                'id'        => 0,
                'item_id'  => $data['itemId'],
                'sklad_alt' => $data['sklad']['ToSkladAlt'],
                'onSklad'   => $data['count']
            );
            $this->db->insert('wh_items', $_wh_items);
        }
        //Запишем передвижение
        $this->db->insert('wh_traffic', $_wh_input);
        //echo $this->db->last_query();
        //и напоследок спишем Н предметов со склада
        $this->db->set('onSklad', 'wh_items.onSklad - '.$data['count'], FALSE);
        $this->db->where('wh_items.sklad_alt', $data['sklad']['FromSkladAlt']);
        $this->db->where('wh_items.item_id', $data['itemId']);
        $this->db->update('wh_items');
        //echo $this->db->last_query();
        $this->db->trans_complete();
    }
    
    /**
     * Сохраняет предмет
     * @param array $data массив с данными
     * @param string $wh_id Альт. имя склада
     * @return int Код вставленного предмета
     */
    function SaveItem($data, $wh_id) 
    {
        $item_id = FALSE;
        $this->db->trans_start();
        
        $data['buy_date'] = date('Y:m:d H:m');
        $this->db->insert('items', $data);
        $item_id = $this->db->insert_id();
        //Запишем склад
        $this->db->insert('wh_items', array(
                                        'id'        => 0,
                                        'item_id'   => $item_id,
                                        'sklad_alt' => $wh_id,
                                        'onSklad'   => $data['buy_count']
                                        )
                );
        echo $this->db->last_query();
        $this->db->trans_complete();
        return $item_id;
    }
    /**
     * Возвращает количество предметов на складе, или кол-во всех
     * @param string $sklad Аль. имя склада
     * @return int Количество предметов на складе
     */
    function ItemCount($sklad = NULL) 
    {
        $q = 0;
        if ($sklad)
        {
            //$this->db->get_where('items', array()), 
            $this->db->where('sklad_alt', $sklad);
            $q = $this->db->count_all_results('wh_items');
        }
        else
        {
            //$this->db->select('COUNT(*)');
            $q = $this->db->count_all('items');
        }
        return $q;
    }
    
    /**
     *  Список предметов по складу
     */
    function ItemsList($sklad = NULL, $fromLimit, $count = 100)
    {
        $this->db
                ->select('
                    items.id,
                    items.name,
                    item_group.name as gname,
                    wh_items.onSklad')
                ->from('items')
                ->join('item_group', 'item_group.id = items.group_id', 'inner')
                ->join('wh_items', 'items.id = wh_items.item_id', 'inner')
                ->where('wh_items.sklad_alt', $sklad)
                ->order_by('items.id', 'ASC')
                ->limit($count, $fromLimit);
        $q = $this->db->get();
        return $q->result_array();
    }
   
    function ItemCountSearch($sklad = NULL,  $key = null, $name = null, $cat = null)
    {
        $this->db

                ->from('items')
                ->join('item_group', 'item_group.id = items.group_id', 'inner')
                ->join('wh_items', 'items.id = wh_items.item_id', 'inner')
                ->where('wh_items.sklad_alt', $sklad)
                ->order_by('items.id', 'ASC');
        if (isset($key) && $key != '')
            $this->db->where('items.id', $key);
        if (isset($name) && $name != '')
            $this->db->like('items.name', $name);
        if (isset($cat) && $cat != 'none')
            $this->db->where('item_group.id', $cat);
        $q = $this->db->get();
        return $q = $this->db->count_all();
    }
    /**
     * Поиск предметов по заданным предметам
     * @param type $key Код предмета
     * @param type $name Наименование
     * @param type $cat Код категории
     * @return type 
     */
    function ItemsSearch($sklad = NULL, $fromLimit, $key = null, $name = null, $cat = null, $count = 100)
    {
        $this->db
                ->select('
                    items.id,
                    items.name,
                    item_group.name as gname,
                    wh_items.onSklad')
                ->from('items')
                ->join('item_group', 'item_group.id = items.group_id', 'inner')
                ->join('wh_items', 'items.id = wh_items.item_id', 'inner')
                ->where('wh_items.sklad_alt', $sklad)
                ->limit($count, $fromLimit);
        if (isset($key) && $key != '')
            $this->db->where('items.id', $key);
        if (isset($name) && $name != '')
            $this->db->like('items.name', $name);
        if (isset($cat) && $cat != 'none')
            $this->db->where('item_group.id', $cat);
        $q = $this->db->get();
        return $q->result_array();
    }
}
?>
